﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.View;
using SIIE_ERP.Codigo;
using Elysium.Demo.Controls;
using System.Data;

namespace Elysium.Demo.Bancos.Transacciones
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class PagoProveedores_Edita : UserControl, IPropiedadesNavegacion
    {
        #region NAVEGACION
        ////////////////////////////////////////////////////////////////////////////
        //  PROPIEDADES DE NAVEGACION
        public string Texto { get { return _texto; } }
        public TabControl TabControlPadre { get { return _tabControlPadre; } }
        public TabItem TabItemPadre { get { return _tabItemPadre; } }

        private string _texto;
        private TabControl _tabControlPadre;
        private TabItem _tabItemPadre;

        public void setParametros(string Texto, ref TabControl tabControl, ref TabItem tabItem)
        {
            this._texto = Texto; this._tabControlPadre = tabControl; this._tabItemPadre = tabItem;
        }

        private void ButtonRegresar_Click(object sender, RoutedEventArgs e)
        {
            _tabControlPadre.Items.Remove(_tabItemPadre);
        }
        // FIN DE PROPIEDADES DE NAVEGACION
        ///////////////////////////////////////////////////////////////////////////
        #endregion

        private UsuarioActivo _sesion;
        private Int32 Secuencia;
        private Int32 CuentaBancaria;
        private Int32 MonedaPago;
        private Int32 IdPago;
        private string Proveedor;
        private bool EsIngreso;
       
        public PagoProveedores_Edita(UsuarioActivo usuario, string Secuencia)
        {
            InitializeComponent();
            this._sesion = usuario;
            this.Secuencia = Int32.Parse(Secuencia);
            CargarDatos();
            CargarPartidas();
            ComboDocumentos.SelectionChanged += ComboDocumentos_SelectionChanged;
        }

        private void CargarDatos()
        {
            var db = new SIIE_ERP.BaseDatos.Bancos.dbo_Pago_Proveedor(_sesion.RFC, _sesion.UserName);
            var pago = db.Get_Pago_A_Proveedores_Por_Secuencia(Secuencia).Rows[0];

            LabelSecuencia.Content = pago["Secuencia"].ToString();
            LabelProveedor.Content = pago["Desc_Proveedor"].ToString();
            LabelFecha.Content = Convert.ToDateTime(pago["Fecha_Pago"].ToString().Substring(0, pago["Fecha_Pago"].ToString().Length - 5)).ToShortDateString();
            LabelImporte.Content = pago["Importe"].ToString();
            LabelConcepto.Content = pago["Concepto"].ToString();
            LabelMoneda.Content = pago["Desc_Moneda"].ToString();
            LabelFormaPago.Content = pago["Desc_Forma_Pago"].ToString();
            LabelReferencia.Content = pago["Referencia"].ToString();
            LabelEstatus.Content = SIIE_ERP.View.Mensajes.getMessage((SIIE_ERP.BaseDatos.EstatusDocs_Id)pago["Estatus"]);
            LabelPorAplicar.Content = pago["Pendiente_por_Aplicar"].ToString();

            IdPago = Int32.Parse(pago["Id_Pago"].ToString());
            CuentaBancaria = Int32.Parse(pago["Id_Cuenta"].ToString());
            MonedaPago = Int32.Parse(pago["Id_Moneda"].ToString());
            Proveedor = pago["Id_Proveedor"].ToString();
            EsIngreso = bool.Parse(pago["EsIngreso"].ToString());

            ComboTipoDocumento.Items.Clear();
            ComboTipoDocumento.Items.Add("Todos los documentos");

            if (bool.Parse(pago["EsIngreso"].ToString()))
            {
               // ComboTipoDocumento.Items.Add("Nota de crédito");
                ComboTipoDocumento.Items.Add("Devolución");
            }
            else
            {
                ComboTipoDocumento.Items.Add("Factura");
                ComboTipoDocumento.Items.Add("Recepción");                
            }

            ComboTipoDocumento.SelectedIndex = 0;                                   
            ComboBoxUI.ComboDocumentos_AutoComplete_Proveedor(ref ComboDocumentos, _sesion, Proveedor, true, true);            
        }
        
        // Agrega una partida
        private void Button_Guardar_Click(object sender, RoutedEventArgs e)
        {
            double Saldo_Value = 0;
            double ImporteAsignar_Value = 0;

            try
            {
                Saldo_Value = Double.Parse(CampoSaldo.Text);
            }
            catch (Exception Ex)
            {
                MessageBox.Show("Favor de seleccionar un Documento Válido");
                return;
            }

            try
            {
                ImporteAsignar_Value = Double.Parse(CampoImporteAsignar.Text);
            }
            catch (Exception Ex)
            {
                MessageBox.Show("Favor de ingresar un importe Válido");
                return;
            }

            if (ImporteAsignar_Value > Double.Parse(LabelPorAplicar.Content.ToString()))
            {
                MessageBox.Show("La cantidad ingresada debe ser menor o igual al saldo por aplicar.");
                return;
            }

            if (ImporteAsignar_Value > Double.Parse(CampoSaldo.Text))
            {
                MessageBox.Show("La cantidad ingresada debe ser menor o igual al saldo del documento.");
                return;
            }

            if (ImporteAsignar_Value > 0)
            {
                // Disminuir el valor de Por Asignar
                var ans = new SIIE_ERP.BaseDatos.Bancos.dbo_Pago_Proveedor(_sesion.RFC, _sesion.UserName).
                                        Update_Pagos_A_Proveedores(Secuencia, Double.Parse(CampoImporteAsignar.Text)).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                // Disminuir el valor del saldo del documento               
                var documento = Int32.Parse(new SIIE_ERP.BaseDatos.Compras.Transacciones.Documento_Compras(_sesion.RFC, _sesion.UserName)
                                            .Get_Documento_By_Id_Without_FK((ComboDocumentos.SelectedItem as CAutocompleteDocumentos).TipoDocumento,
                                                                 Int32.Parse(ComboDocumentos.SelectedValue.ToString()))
                                                                 .Rows[0]["Id_Moneda"].ToString());

                var FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(MonedaPago, // Id Moneda del Pago
                                                                      Double.Parse(CampoImporteAsignar.Text), _sesion);

                var Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(documento, // Id Moneda del Documento
                            FMonedaToPesos, _sesion);                                    // Este monto esta en la moneda del documento

                ans = new SIIE_ERP.BaseDatos.Compras.Transacciones.Documento_Compras(_sesion.RFC, _sesion.UserName).
                        Update_Saldo_Documento_By_Id((ComboDocumentos.SelectedItem as CAutocompleteDocumentos).TipoDocumento,
                                                     Int32.Parse(ComboDocumentos.SelectedValue.ToString()),
                                                    Monto).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                // Actualizar la cuenta bancaria
                var cuenta = Int32.Parse(new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Cuenta_Bancaria(_sesion.RFC, _sesion.UserName)
                                                     .Get_Cuenta_Bancaria_Por_Id(CuentaBancaria).Rows[0]["Id_Moneda"].ToString());


                //Calcular el monto de Id de Pago a Id de Cuenta.
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(cuenta, // Id Moneda Cuenta Bancaria
                        SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(MonedaPago, // Id Moneda Pago
                                 Double.Parse(CampoImporteAsignar.Text), _sesion), _sesion); // Este monto esta en la moneda de la cuenta bancaria

                // Realizar la operacion
                if (!EsIngreso)
                {
                    Monto = Monto * (-1);
                }

                // Actualizar el saldo de la cuenta bancaria
                ans = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Cuenta_Bancaria(_sesion.RFC, _sesion.UserName)
                                            .Update_Saldo_Cuenta_Bancaria_Por_Id(CuentaBancaria, Monto).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                //Registrar el movimiento
                ans = new SIIE_ERP.BaseDatos.Bancos.dbo_Pago_Proveedor(_sesion.RFC, _sesion.UserName)
                                                                 .Insert_Pago_Proveedor_Linea(
                                                                    IdPago.ToString(),
                                                                    ComboDocumentos.SelectedValue.ToString(),
                                                                    (ComboDocumentos.SelectedItem as CAutocompleteDocumentos).TipoDocumento,
                                                                    true,
                                                                    Double.Parse(CampoImporteAsignar.Text).ToString(),
                                                                    "1"
                                                                 ).Id;
                if (ans != 1)
                {
                    MessageBox.Show("Fatal error");
                    return;
                }

                MessageBox.Show("Operacion realizada correctamente");
                CampoImporteAsignar.Text = "";
                CargarDatos();
                CargarPartidas();
                ComboDocumentos.SelectedItem = null;
            }
            else
            {
                MessageBox.Show("Favor de Ingresar una cantidad mayor a cero en Importe por Aplicar.");
            }
        }

        // Carga las partidas
        private void CargarPartidas()
        {
            var db = new SIIE_ERP.BaseDatos.Bancos.dbo_Pago_Proveedor(_sesion.RFC, _sesion.UserName);
            var partidas = db.Get_Pagos_A_Proveedores_Lineas(IdPago.ToString()).Rows;

            PartidasDataGrid.Items.Clear();
            foreach (DataRow partida in partidas)
            {
                var Serie = new SIIE_ERP.BaseDatos.Compras.Transacciones.Documento_Compras(_sesion.RFC, _sesion.UserName)
                                        .Get_Serie_Documento_By_Id((SIIE_ERP.BaseDatos.Documentos_Id)partida["Id_TipoDocumento"], Int32.Parse(partida["Id_Doc"].ToString()));
                var Documento = Get_Tipo_Documento_Name(partida["Id_TipoDocumento"]) + Serie + partida["Id_Doc"].ToString();
                var Importe = partida["Importe"].ToString();
                var Fecha = partida["Fecha_Alta"].ToString();
                PartidasDataGrid.Items.Add(new CPagoClientes(Documento, Importe, Fecha));
            }
        }

        // Actualiza la lista de documentos cuando el tipo de documento cambia.
        private void ComboTipoDocumento_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (ComboTipoDocumento.SelectedValue != null && Proveedor != null)
            {
                if (ComboTipoDocumento.SelectedValue.Equals("Todos los documentos"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete_Proveedor(ref ComboDocumentos, _sesion, Proveedor, EsIngreso, true);
                }
                // DOCUMENTOS DE ENTRADA
                //else if (ComboTipoDocumento.SelectedValue.Equals("Nota de crédito"))
                //{
                //    ComboBoxUI.ComboDocumentos_AutoComplete_Proveedor(ref ComboDocumentos, _sesion, Proveedor, true, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_NotaCreditoProveedor);
                //}
                else if (ComboTipoDocumento.SelectedValue.Equals("Devolución"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete_Proveedor(ref ComboDocumentos, _sesion, Proveedor, true, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_DevolucionProveedor);
                }                
                // DOCUMENTOS DE SALIDA
                else if (ComboTipoDocumento.SelectedValue.Equals("Factura"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete_Proveedor(ref ComboDocumentos, _sesion, Proveedor, false, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_FacturaProveedor);
                }
                else if (ComboTipoDocumento.SelectedValue.Equals("Recepción"))
                {
                    ComboBoxUI.ComboDocumentos_AutoComplete_Proveedor(ref ComboDocumentos, _sesion, Proveedor, false, false, SIIE_ERP.BaseDatos.Documentos_Id.Doc_Recepcion);
                }
            }
        }

        // Actualiza el saldo cuando el documento seleccionado cambia
        private void ComboDocumentos_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var db = new SIIE_ERP.BaseDatos.Compras.Transacciones.Documento_Compras(_sesion.RFC, _sesion.UserName);
            var seleccionado = ((sender as FilteredComboBox).SelectedItem as CAutocompleteDocumentos);
            if (seleccionado != null)
            {
                var saldo = db.Get_Saldo_Documento_By_Id(seleccionado.TipoDocumento, Int32.Parse(seleccionado.Id), MonedaPago);
                CampoSaldo.Text = saldo.ToString();
            }
            else
            {
                CampoSaldo.Text = "";
            }
        }

        // Para el datagrid de las partidas
        class CPagoClientes
        {
            public string Documento { get; set; }
            public string Importe { get; set; }
            public string Fecha { get; set; }
            public CPagoClientes(string Documento, string Importe, string Fecha)
            {
                this.Documento = Documento;
                this.Importe = Importe;
                this.Fecha = Fecha;
            }
        }

        private string Get_Tipo_Documento_Name(object s)
        {
            SIIE_ERP.BaseDatos.Documentos_Id doc = (SIIE_ERP.BaseDatos.Documentos_Id)s;
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_FacturaProveedor)
            {
                return "Factura ";
            }
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_Recepcion)
            {
                return "Recepción ";
            }
            //if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_NotaCreditoProveedor)
            //{
            //    return "Nota de Crédito ";
            //}
            if (doc == SIIE_ERP.BaseDatos.Documentos_Id.Doc_DevolucionProveedor)
            {
                return "Devolución ";
            }
            return "";
        }

        // Limpiar el saldo
        private void Button_Guardar_Copy_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro de limpiar el saldo?", "Limpiar", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                var ans = new SIIE_ERP.BaseDatos.Bancos.dbo_Pago_Proveedor(_sesion.RFC, _sesion.UserName).
                                       Update_Pagos_A_Proveedores_Zero(Secuencia).Id;
                if (ans == 1)
                {
                    CargarDatos();
                }
                else
                {
                    MessageBox.Show("Error la limpiar el saldo.");
                }
            }
        }

        /// Validacion del campo Importe por asignar.
        private void CampoImporteAsignar_LostFocus(object sender, RoutedEventArgs e)
        {

        }

        // Ayuda
        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("Pagos_Proveedores.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }
        

        // Mostrar documentos relacionados
        private void ButtonF5_Click(object sender, RoutedEventArgs e)
        {
            WindowRelacion Relacion = new Elysium.Demo.WindowRelacion(IdPago, SIIE_ERP.BaseDatos.Documentos_Id.Doc_PagoProveedor);
            Relacion.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Relacion.ShowDialog();
        }

        // Duplicar el pago a proveedores.
        private void ButtonF6_Click(object sender, RoutedEventArgs e)
        {
            // Duplicar los datos
            var db = new SIIE_ERP.BaseDatos.Bancos.dbo_Pago_Proveedor(_sesion.RFC, _sesion.UserName);
            var pago = db.Get_Pago_A_Proveedores_Por_Secuencia(Secuencia).Rows[0];

            string TipoPago_Cliente = "";

            if (pago["EsIngreso"].ToString().Equals("False"))
            {
                TipoPago_Cliente = "Egreso";
            }
            else
            {
                TipoPago_Cliente = "Ingreso";
            }
            
            if (db.Insert_Pago_Proveedor_Cab(pago["Id_Proveedor"].ToString(),
                                          Convert.ToDateTime(pago["Fecha_Pago"].ToString().Substring(0,pago["Fecha_Pago"].ToString().Length - 5)),
                                          pago["Id_Forma_Pago"].ToString(),
                                          pago["Id_Cuenta"].ToString(),
                                          pago["Concepto"].ToString(),
                                          pago["Referencia"].ToString(),
                                          pago["Id_Moneda"].ToString(),
                                          pago["Importe"].ToString(),
                                          TipoPago_Cliente).Id != 1)
            {
                MessageBox.Show("Fatal Error");
            }

            // Obtener el Id del registro que se acaba de insertar
            var pagos = db.Get_Pagos_A_Proveedores();
            var IdDestino = Int32.Parse(pagos.Rows[0]["Id_Pago"].ToString());

            // Insertar registro
            SIIE_ERP.BaseDatos.dbo_Trans_Relacion_Documentos
                              .Insert_Relacion_Documentos(  IdPago,
                                                            IdDestino,
                                                            SIIE_ERP.BaseDatos.Documentos_Id.Doc_PagoProveedor,
                                                            SIIE_ERP.BaseDatos.Documentos_Id.Doc_PagoProveedor,
                                                            _sesion.UserName);

            SIIE_ERP.View.NavegacionUI.AbrirPestanaEditar(IdDestino.ToString(), typeof(PagoProveedores_Edita), ref _tabControlPadre, _sesion);

            MessageBox.Show("Registro duplicado exitosamente.");
        }
    }
}
